home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
MACD 5
/
MACD 5.bin
/
workbench
/
tools
/
czesc_3
/
phoonsrc
/
amiga.c
next >
Wrap
C/C++ Source or Header
|
1994-02-23
|
5KB
|
199 lines
/*
* amiga.c
*
* Author: Tomi Ollila <too@cs.hut.fi>
*
* Created: Sun Jul 05 15:30:58 1992 too
* Last modified: Thu Feb 24 11:55:00 1994 too
*
*/
asm(".text; jmp _start");
#include <exec/types.h>
#include <intuition/intuition.h>
#include <libraries/locale.h>
#define IFFL_CloseIFF IFFL_NO1
#define IFFL_DecodePic IFFL_NO2
#define IFFL_GetBMHD IFFL_NO3
#define IFFL_OpenIFF IFFL_NO4
#define IFFL_SaveBitMap IFFL_NO5
#include "iff.h"
#undef IFFL_CloseIFF
#undef IFFL_DecodePic
#undef IFFL_GetBMHD
#undef IFFL_OpenIFF
#undef IFFL_SaveBitMap
#include "inlines_other.h"
#include "inline_iff.h"
#include <stdlib.h>
#include <string.h>
#include "amiga.h"
#ifndef NULL
#define NULL 0
#endif
static const char ver[] = "$VER: phoon 2.1 (24.2.1994)";
struct ExecBase * SysBase = NULL;
struct DosLibrary * DOSBase = NULL;
struct IntuitionBase * IntuitionBase = NULL;
struct GfxBase * GfxBase = NULL;
struct Library * IFFBase = NULL;
struct Library * MathIeeeDoubBasBase = NULL;
struct Library * MathIeeeDoubTransBase = NULL;
struct Library * LocaleBase = NULL;
#define SL(a) ((struct Library **)a)
struct {
struct Library ** base;
char * name;
int version;
} libtable[] = {
{ SL(&DOSBase), "dos.library", 36 },
{ SL(&IntuitionBase), "intuition.library", 36 },
{ SL(&GfxBase), "graphics.library", 36 },
{ SL(&IFFBase), "iff.library", 23 },
{ SL(&MathIeeeDoubBasBase), "mathieeedoubbas.library", 36 },
{ SL(&MathIeeeDoubTransBase), "mathieeedoubtrans.library", 36 },
{ NULL }
};
struct RDArgs * rdargs = NULL;
WORD gmtoffset = 32767;
BOOL am_OpenLibraries()
{
int i;
struct Library ** lib;
struct Locale * locale;
SysBase = *(struct ExecBase **)4;
for (i = 0; (lib = libtable[i].base); i++) {
if ((*lib = OpenLibrary(libtable[i].name, libtable[i].version)) == NULL) {
Printf("Could not open %s\n", libtable[i].name);
return FALSE;
}
}
if ((LocaleBase = OpenLibrary("locale.library", 38)) != NULL) {
if ((locale = OpenLocale(NULL)) != NULL) {
gmtoffset = locale->loc_GMTOffset;
CloseLocale(locale);
}
CloseLibrary(LocaleBase);
}
if ((rdargs = ReadArgs(TEMPLATE, args, NULL)) == NULL) {
Printf(usage);
return FALSE;
}
return TRUE;
}
int am_CloseLibraries(int retval)
{
int i;
struct Library ** lib;
if (rdargs)
FreeArgs(rdargs);
for (i = 0; (lib = libtable[i].base); i++)
if (*lib)
CloseLibrary(*lib);
return retval;
}
BOOL am_GetScreenSize(int * w, int * h)
{
struct Screen screen;
if (GetScreenData((APTR)&screen, sizeof(struct Screen),
WBENCHSCREEN, NULL) == NULL) {
Printf("Could not figure out screensize.\n");
return FALSE;
}
*w = screen.Width;
*h = screen.Height;
return TRUE;
}
char * am_LoadFullmoon(int * w,int * h, char * filename)
{
PLANEPTR plane = NULL;
IFFL_HANDLE iffhandle;
struct BitMap bitmap;
struct IFFL_BMHD * bmhd;
int size;
if (filename == NULL)
filename = "fullmoon.ilbm\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
if ((iffhandle = IFFL_OpenIFF(filename, IFFL_MODE_READ)) == NULL) {
Printf("Error: Could not open %s for reading as fullmoon picture\n",
filename);
return NULL;
}
if ((bmhd = IFFL_GetBMHD(iffhandle)) == NULL) {
Printf("Error: no BMHD chunk in %s \n", filename);
goto exit;
}
*w = (int)bmhd->w; *h = (int)bmhd->h;
size = BitmapSize(bmhd->w, bmhd->h);
if ((plane = (PLANEPTR)AllocVec(size, 0)) == NULL) {
Printf("Out of memory\n");
goto exit;
}
InitBitMap(&bitmap, 1, bmhd->w, bmhd->h);
bitmap.Planes[0] = plane;
if (IFFL_DecodePic(iffhandle, &bitmap) == FALSE) {
Printf("Error: Could not decode IFF picture\n");
FreeVec(plane);
plane = NULL;
}
exit:
IFFL_CloseIFF(iffhandle);
return (char *)plane;
}
static UWORD colortable[] = {0xaaa, 0x000, 0xfff, 0x68b};
void am_MakeIFFile(int w, int h, char * bits, int reverseflag)
{
struct BitMap bitmap;
LONG size;
ULONG *plane1, *plane0;
int i;
InitBitMap(&bitmap, 2, w, h);
size = BitmapSize(w, h);
plane0 = (ULONG *)bits;
if ((plane1 = (ULONG *)AllocMem(size, 0)) == NULL) {
Printf("Out of memory\n");
return;
}
bitmap.Planes[reverseflag] = (PLANEPTR)plane1;
bitmap.Planes[(reverseflag + 1) & 1] = (PLANEPTR)plane0;
for (i = 0; i < size >> 2; i++)
plane1[i] = plane0[i] ^ 0xffffffff;
(void)IFFL_SaveBitMap("RAM:phoon.ilbm", &bitmap, colortable, 0);
FreeMem(plane1, size);
}